package ru.emms.codemeter.exportdata;

import com.intellij.openapi.diagnostic.Logger;
import org.apache.commons.lang.StringUtils;
import org.jfree.chart.ChartUtilities;
import org.jfree.chart.JFreeChart;

import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.util.List;
import java.util.Map;

/**
 * User: nastya.kuz
 * Date: 01.11.2010
 * Выгрузка данных в выходной поток
 */

public class Exporter {

    private static Logger log = Logger.getInstance(Exporter.class.getName());
    private static final char END_OF_LINE_CHARACTER = '\n';

    /**
     * выгружает передаваемые списки модулей,версий и метрик в выходной поток  <br>
     * пример: поступили следующие входные данные <br>
     * [("module1"[(1,[2,3,4]),(2,[4,6,7])),("module2"[(3,[2,3,4]),(4,[4,6,7]))] <br>
     * <br>
     * в поток это запишется в следующем виде:                                   <br>
     * Имя модуля   module1                                                      <br>
     * <table>  <tr><td>Версия</td>  <td>Метрика1</td>  <td>Метрика2</td>  <td>Метрика3</td></tr><br>
     * <tr><td>1</td><td>2</td><td>3</td><td>4</td></tr><br>
     * <tr><td>2</td><td>4</td><td>6</td><td>7</td></tr><br>
     * </table> <br>
     * <p/>
     * <br>
     * Имя модуля   module2                                                      <br>
     * <table>  <tr><td>Версия</td>  <td>Метрика1</td>  <td>Метрика2</td>  <td>Метрика3</td></tr><br>
     * <tr><td>3</td><td>2</td><td>3</td><td>4</td></tr><br>
     * <tr><td>4</td><td>4</td><td>6</td><td>7</td></tr><br>
     * </table> <br>
     *
     * @param exportData Карта с парами (имя модуля,(версия,[метрики]))
     * @param names      список имен модулей
     * @param output     выходной поток, в который записываются выходные данные
     *
     * @throws java.io.IOException если произошла ошибка создания, записи или закрытия потока
     */
    public static void exportTable(Map<String, Map<Long, List<Long>>> exportData, List<String> names, OutputStream output)
            throws IOException {
        OutputStreamWriter outputStream = new OutputStreamWriter(output);
        String metricsNames = StringUtils.join(names, ";") + END_OF_LINE_CHARACTER;
        //пока есть модули,выполнить
        for (String module : exportData.keySet()) {
            log.debug("обрабатываем модуль: " + module);
            //получаем очередное имя модуля и пишем его в выходной поток
            outputStream.append("имя модуля;").append(module).append(END_OF_LINE_CHARACTER).append("версия;").append(metricsNames);
            //по имени модуля получаем карту его версий и метрик
            Map<Long, List<Long>> verAndMetrics = exportData.get(module);
            //получаем множество всех версий текущего модуля
            for (Map.Entry<Long, List<Long>> entry : verAndMetrics.entrySet()) {
                String moduleVersion = entry.getKey().toString();
                outputStream.append(moduleVersion).append(" ;");
                for (Long metric : entry.getValue()) {
                    String metricValue = metric.toString();
                    outputStream.append(metricValue).append(" ;");
                }
                outputStream.append(END_OF_LINE_CHARACTER);
            }
            outputStream.append(END_OF_LINE_CHARACTER);
        }
        outputStream.close();
    }

    /**
     * записывает график в выходной поток
     *
     * @param output выходной поток для записи
     * @param chart  панель графика
     * @param width  ширина графика
     * @param height высота графика
     */
    public static void exportGraphic(OutputStream output, JFreeChart chart, int width, int height) {
        try {
            ChartUtilities.writeChartAsPNG(output, chart, width, height);
        } catch (IOException e) {
            // todo думаю, надо как то сообщать об ошибке в интерфейс
            log.error("ошибка экспорта графика", e);
        }
    }

}

